package io.renren.modules.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author：T-weiwei
 * @Description: mq配置类
 * @Email：tweiwei@aliyun.com
 * @CreateDate：2022-01-27-上午9:54
 * @CopyRight：http://www.huaxun.ink/
 * @Hint： This content is limited to the internal circulation of HuaXun Hi Tech Co., Ltd.,
 * and is forbidden to be leaked and used for other commercial purposes
 * 注: 引入该rabbitmq的配置以及代码适用于高可靠传输,如果业务允许数据的出错性,可以剔除死信队列以及手动确认机制,从而提高mq的吞吐量.
 **/
@Configuration
public class MqConfig {
    /**
     * 加油站交换机名称
     */
    public static final String GAS_STATION_EXCHANGE = "gas-station-exchange";

    /**
     * 加油站队列名称
     */
    public static final String GAS_STATION_QUEUE = "gas-station-queue";

    /**
     * 定义加油站交换机
     * @return fanout类型交换机实例
     */
    @Bean
    public FanoutExchange gasStationExchange() {
        return (FanoutExchange) ExchangeBuilder.fanoutExchange(GAS_STATION_EXCHANGE).durable(true).build();
    }

    /**
     * Queue有4个参数：
     *  1. 队列名
     *  2. durable      持久化消息队列，rabbitmq冲洗的时候，队列不会消失，不需要重建，默认true
     *  3. auto-delete  表示消息队列在没有使用的时候将被自动删除，默认false
     *  4. exclusive    表示消息队列是否只在当前的connection生效，默认false
     * @return 加油站队列实例
     */
    @Bean
    public Queue gasStationQueue() {
        return new Queue(MqConfig.GAS_STATION_QUEUE, true, false, false);
    }

    /**
     * 绑定加油站交换机与加油站队列实例
     * @return 绑定结果
     */
    @Bean
    public Binding bindingGasStationExchangeAndGasStationQueue(FanoutExchange gasStationExchange, Queue gasStationQueue) {
        return BindingBuilder.bind(gasStationQueue).to(gasStationExchange);
    }
}
